import axios from 'axios';
import { ElMessage } from 'element-plus';
import { getToken, removeToken } from './auth';
import store from '../store';
import router from '../router';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';

// 创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 10000, // 请求超时时间
});

// NProgress配置
NProgress.configure({ showSpinner: false });

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 开始进度条
    NProgress.start();
    
    // 设置请求头的token
    const token = getToken();
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    
    return config;
  },
  (error) => {
    // 关闭进度条
    NProgress.done();
    console.error('请求错误', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    // 关闭进度条
    NProgress.done();
    
    const res = response.data;
    
    // 根据自定义状态码判断请求是否成功
    if (res.code !== 200) {
      // 显示错误消息
      ElMessage({
        message: res.message || '请求失败',
        type: 'error',
        duration: 5 * 1000,
      });
      
      // 处理特定错误码
      // 401: 未授权，token过期或无效
      if (res.code === 401) {
        // 确认提示框
        ElMessageBox.confirm(
          '您的登录状态已过期，请重新登录',
          '确认退出',
          {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning',
          }
        ).then(() => {
          // 清除token和用户信息
          store.dispatch('user/resetToken').then(() => {
            // 刷新页面
            location.reload();
          });
        });
      }
      
      return Promise.reject(new Error(res.message || '请求失败'));
    } else {
      return res.data;
    }
  },
  (error) => {
    // 关闭进度条
    NProgress.done();
    
    const { response } = error;
    let message = '网络错误';
    
    if (response) {
      // 根据HTTP状态码显示不同的错误消息
      switch (response.status) {
        case 400:
          message = '请求错误';
          break;
        case 401:
          message = '未授权，请重新登录';
          // 清除token并跳转到登录页
          store.dispatch('user/logout').then(() => {
            router.push('/login');
          });
          break;
        case 403:
          message = '拒绝访问';
          break;
        case 404:
          message = `请求地址出错: ${error.response.config.url}`;
          break;
        case 408:
          message = '请求超时';
          break;
        case 500:
          message = '服务器内部错误';
          break;
        case 501:
          message = '服务未实现';
          break;
        case 502:
          message = '网关错误';
          break;
        case 503:
          message = '服务不可用';
          break;
        case 504:
          message = '网关超时';
          break;
        case 505:
          message = 'HTTP版本不受支持';
          break;
        default:
          message = `请求失败: ${error.message}`;
      }
    }
    
    ElMessage({
      message: message,
      type: 'error',
      duration: 5 * 1000,
    });
    
    return Promise.reject(error);
  }
);

// 封装GET请求
export function get(url, params) {
  return service({
    url,
    method: 'get',
    params,
  });
}

// 封装POST请求
export function post(url, data) {
  return service({
    url,
    method: 'post',
    data,
  });
}

// 封装PUT请求
export function put(url, data) {
  return service({
    url,
    method: 'put',
    data,
  });
}

// 封装DELETE请求
export function del(url, params) {
  return service({
    url,
    method: 'delete',
    params,
  });
}

export default service; 